home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 3 / BBS in a box - Trilogy III.iso / Files / Prog / B-C / Berkeley-yacc-mpw / symtab.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-14  |  3.8 KB  |  159 lines  |  [TEXT/MPS ]

  1. /*
  2.  * Copyright (c) 1989 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * This code is derived from software contributed to Berkeley by
  6.  * Robert Paul Corbett.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *    This product includes software developed by the University of
  19.  *    California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  */
  36.  
  37. #ifndef lint
  38. static char sccsid[] = "@(#)symtab.c    5.3 (Berkeley) 6/1/90";
  39. #endif /* not lint */
  40.  
  41. #include "defs.h"
  42.  
  43. /* TABLE_SIZE is the number of entries in the symbol table. */
  44. /* TABLE_SIZE must be a power of two.                */
  45.  
  46. #define    TABLE_SIZE 1024
  47.  
  48.  
  49. bucket **symbol_table;
  50. bucket *first_symbol;
  51. bucket *last_symbol;
  52.  
  53.  
  54. int
  55. hash(name)
  56. char *name;
  57. {
  58.     register char *s;
  59.     register int c, k;
  60.  
  61.     assert(name && *name);
  62.     s = name;
  63.     k = *s;
  64.     while (c = *++s)
  65.     k = (31*k + c) & (TABLE_SIZE - 1);
  66.  
  67.     return (k);
  68. }
  69.  
  70.  
  71. bucket *
  72. make_bucket(name)
  73. char *name;
  74. {
  75.     register bucket *bp;
  76.  
  77.     assert(name);
  78.     bp = (bucket *) MALLOC(sizeof(bucket));
  79.     if (bp == 0) no_space();
  80.     bp->link = 0;
  81.     bp->next = 0;
  82.     bp->name = MALLOC(strlen(name) + 1);
  83.     if (bp->name == 0) no_space();
  84.     bp->tag = 0;
  85.     bp->value = UNDEFINED;
  86.     bp->index = 0;
  87.     bp->prec = 0;
  88.     bp-> class = UNKNOWN;
  89.     bp->assoc = TOKEN;
  90.  
  91.     if (bp->name == 0) no_space();
  92.     strcpy(bp->name, name);
  93.  
  94.     return (bp);
  95. }
  96.  
  97.  
  98. bucket *
  99. lookup(name)
  100. char *name;
  101. {
  102.     register bucket *bp, **bpp;
  103.  
  104.     bpp = symbol_table + hash(name);
  105.     bp = *bpp;
  106.  
  107.     while (bp)
  108.     {
  109.     if (strcmp(name, bp->name) == 0) return (bp);
  110.     bpp = &bp->link;
  111.     bp = *bpp;
  112.     }
  113.  
  114.     *bpp = bp = make_bucket(name);
  115.     last_symbol->next = bp;
  116.     last_symbol = bp;
  117.  
  118.     return (bp);
  119. }
  120.  
  121.  
  122. create_symbol_table()
  123. {
  124.     register int i;
  125.     register bucket *bp;
  126.  
  127.     symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *));
  128.     if (symbol_table == 0) no_space();
  129.     for (i = 0; i < TABLE_SIZE; i++)
  130.     symbol_table[i] = 0;
  131.  
  132.     bp = make_bucket("error");
  133.     bp->index = 1;
  134.     bp->class = TERM;
  135.  
  136.     first_symbol = bp;
  137.     last_symbol = bp;
  138.     symbol_table[hash("error")] = bp;
  139. }
  140.  
  141.  
  142. free_symbol_table()
  143. {
  144.     FREE(symbol_table);
  145.     symbol_table = 0;
  146. }
  147.  
  148.  
  149. free_symbols()
  150. {
  151.     register bucket *p, *q;
  152.  
  153.     for (p = first_symbol; p; p = q)
  154.     {
  155.     q = p->next;
  156.     FREE(p);
  157.     }
  158. }
  159.